Exemplu cu intreruperi

 

Sa se scrie un program de asamblare care tipareste pe ecran, in baza 10, continutul registrilor AX si BX.

 

Rezolvare: Deoarece nu exista nici o intrerupere, a carei rutina de tratare sa poata tipari (sau citi) un numar in baza 10, va trebui sa ne folosim de functia 02h a intreruperii 21h care stie sa afiseze un caracter sau de functia 09h a intreruperii 21h care afiseaza un sir de caractere. Pentru a ajunge de la un numar (ex. 2435 in baza 10) la un sir de caractere pe care sa-l putem afisa (ex. sirul ‘2’,’4’,’3’,’5’) vom imparti succesiv numarul si caturile obtinute la 10 si vom retine resturile care reprezinta de fapt, cifrele numarului.

 

assume cs:code, ds:data

data segment

            LinieNoua db 10,13,’$’

            zece dw 10

data segment

code segment

            AfisBaza10   PROC

            ; definim o procedura care afiseaza registrul ax in baza 10

            cmp ax, 0

            jge pozitiv

 

            ; altfel, numarul e negativ si afisam un ‘-‘ cu ajutorul functiei 02h a int 21h

            push ax

            mov ah, 02h

            mov dl, ‘-‘

            int 21h

            pop ax

            neg ax              ; ax:= valoarea absoluta a lui ax

 

            pozitiv:

; pentru a nu avea depasiri, vom imparti totdeauna pe DX:AX la 10. Tot
; impartim la 10 si punem resturile obtinute (adica cifrele) pe stiva pentru
; a inversa, in final, ordinea lor.

mov cx, 0 ; in cx, vom retine numarul de cifre puse pe stiva

repeta:

mov dx, 0

div zece

push dx

inc cx

cmp ax, 0

ja repeta ; daca catul>0 jmp repeta

 

; acuma vom scoate fiecare cifra de pe stiva si o vom afisa u ajutorul
; functiei 02h a int 21h

scoate:

pop dx

; restul, adica cifra, se afla in DL (deoarece este un numar intre 0 si ;10)

add dl, ‘0’ ; obtinem caracterul corespunzator cifrei

mov ah, 02h

int 21h

loop scoate

 

ret            ; revenirea din procedura

AfisBaza10 ENDP

           

start:    

            mov ax, data

            mov ds, ax

 

            mov ax, 2435

            ; afisam valoarea din ax apeland procedura AfisBaza10

            call AfisBaza10

            ; sarim la linie noua pe ecran

            mov ah, 09h

            lea dx, LinieNoua

            int 21h

           

            mov ax, bx

            ; afisam valoarea din ax apeland procedura AfisBaza10

            call AfisBaza10

 

            mov ax, 4c00h

            int 21h

code ends

end start

\